package com.edu.controller;

import com.edu.bean.User;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;


/**
 * @SessionAttributes
 *      1. 放在 Controller 类上
 *      2。@SessionAttributes({参数名，参数名})
 *      3. 方法中 只要尝试 向Map中存入 同名的参数时，会向Session中 存入同一份
 */
@Controller
@SessionAttributes({"msg","loginUser"})
public class SessionController {
    /**
     * 向 Session作用域中 存取数据方式一:
     *  直接在 方法中加入一个 HttpSession参数，使用session的 getAttribute/setAttribute 读写数据
     */
/*    @RequestMapping("/login1")
    public String login1(User user, HttpSession session){
        System.out.println("登录成功的用户是"+user);
        session.setAttribute("loginUser",user);
        return "redirect:/success.jsp";
    }*/

    /**
     *  在Controller 的内部 声明一个 HttpSession类型的属性
     */

    @Resource
    private HttpSession session;

    @RequestMapping("/login1")
    public String login1(User user){
        System.out.println("登录成功的用户是"+user);
        session.setAttribute("loginUser",user);
        return "redirect:/success.jsp";
    }


    @RequestMapping("/login2")
    public String login2(User user, Map map){
//        model.addAttribute("msg","hello world");
        map.put("msg","hello world");
        map.put("loginUser",user);
        return "redirect:/success.jsp";
    }


    /**
     * 由于 Controller上 添加了 @SessionAttributes({"msg","loginUser"})
     *  所以 下面的方法 在执行时，会尝试从 session中 取出msg和loginUser，存入到model
     */
    @RequestMapping("getFromSession")
    public String getFromSession(Model model){
        System.out.println(model.getAttribute("msg"));
        return "forward:/index.jsp";
    }

    /**
     * @SessionAttribute("loginUser") 放在形参前，作用是从session中取出 loginUser并赋值给形参u
     */
    @RequestMapping("getFromSession2")
    public String getFromSession2(@SessionAttribute(value="loginUser",required = false)User u, @SessionAttribute(value = "msg",required = false)String m){
        System.out.println(u);
        System.out.println(m);
        return "forward:/index.jsp";
    }
}
